package pages

import (
	"learn/pages/env"
	"learn/pages/project"
	"net/http"

	"github.com/hyahm/xmux"
)

var pl = []string{"Read", "Create", "Update", "Delete"}
var permissionMap = map[string]int{
	"Read":   0,
	"Create": 1,
	"Update": 2,
	"Delete": 3,
}

// 0000  read write exec   byte
// 最基础的4快组件：    路由, 日志, 数据库驱动,  配置文件处理

// xmux    golog
//  https://github.com/hyahm/goconfig :   配置文件处理
//  go  get github.com/hyahm/goconfig
//  https://github.com/hyahm/gomysql:    orm    数据库驱动
// go get github.com/hyahm/gomysql
//  登录  token  redis   {"token": "用户信息"}   // 最复杂的接口
//  普通接口
//  更细致权限验证
//  第三方接口

// 技术栈   go, mysql, redis   最常用的， 也是最基础的

func CheckToken(w http.ResponseWriter, r *http.Request) (post bool) {
	return
}

type Permssioner interface {
	PermKeyValue() map[string]uint8
	GetPages() map[string]struct{}
	GetFuncName() string
}

type MyPerm struct {
	Perm     map[string]uint8
	Pages    map[string]struct{}
	FuncName string
}

func (mp *MyPerm) PermKeyValue() map[string]uint8 {
	// 从数据库拿到的
	return mp.Perm
}

func (mp *MyPerm) GetPages() map[string]struct{} {
	return mp.Pages
}

func (mp *MyPerm) GetFuncName() string {
	return mp.FuncName
}

func (mp *MyPerm) SetPages(pages map[string]struct{}) {

}

// 返回有没有权限, 封装了一层
func HavePerm(p Permssioner) bool {
	perm := p.PermKeyValue()
	pages := p.GetPages()
	page := ""
	// 判断页面权限的
	hasPerm := false
	for role := range perm {
		if _, ok := pages[role]; ok {
			hasPerm = true
			page = role
			break
		}
	}
	if !hasPerm {
		return false
	}
	// permMap := make(map[string]bool)
	result := xmux.GetPerm(pl, perm[page])
	handleName := p.GetFuncName()
	// 这个值就是判断有没有这个操作权限
	return result[permissionMap[handleName]]
}

// 优化：  更简单更快
func permission(w http.ResponseWriter, r *http.Request) (post bool) {
	p := &MyPerm{}
	if p.Perm == nil {
		p.Perm = make(map[string]uint8)
	}
	p.Perm["env"] = 14
	p.Perm["important"] = 10
	p.Perm["project"] = 4
	p.Pages = xmux.GetInstance(r).Get(xmux.PAGES).(map[string]struct{})
	p.FuncName = xmux.GetInstance(r).Get(xmux.CURRFUNCNAME).(string)
	// 是否有权限
	if !HavePerm(p) {
		w.Write([]byte("没有页面权限"))
		return true
	}
	return
	// roles := []string{"env", "important"}
	// perm := make(map[string]uint8)
	// perm["env"] = 14
	// perm["important"] = 10
	// perm["project"] = 4
	// // 这个pages 就是能访问此页面的角色组
	// pages := xmux.GetInstance(r).Get(xmux.PAGES).(map[string]struct{})
	// //  请求/project/read     map[admin:{} project:{}]
	// // 判断 pages 是否存在 perm
	// // 注意点： 这里的页面权限本应该只会匹配到一个， 这个是对于的页面权限的值
	// page := ""
	// // 判断页面权限的
	// hasPerm := false
	// for role := range perm {
	// 	if _, ok := pages[role]; ok {
	// 		hasPerm = true
	// 		page = role
	// 		break
	// 	}
	// }
	// if !hasPerm {
	// 	w.Write([]byte("没有页面权限"))
	// 	return true
	// }

	// // permMap := make(map[string]bool)
	// result := xmux.GetPerm(pl, perm[page])
	// handleName := xmux.GetInstance(r).Get(xmux.CURRFUNCNAME).(string)
	// // 这个值就是判断有没有这个操作权限
	// if !result[permissionMap[handleName]] {
	// 	w.Write([]byte("没有权限"))
	// 	return true
	// }
	// 先拿到pl 对应名称的 索引
	//         8        4        2          1
	//		 delete	 update	 create		read
	//  bit   0        0       0         0
	/*
		用户表
		id
		1
		权限表
		id      uid   roles                       perm
		1       1     "env"                       0-15
		2       1     "important"
	*/
	// return
}

// 设置中心
var Setting *xmux.GroupRoute

func init() {
	Setting = xmux.NewGroupRoute().AddModule(CheckToken, permission)
	// env
	Setting.AddGroup(env.Env)
	// project
	Setting.AddGroup(project.Project)
}
